package ecom;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.*;
import org.apache.commons.logging.*;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.naming.NamingException;
import javax.faces.context.*;

import org.primefaces.event.*;

import ecom.api.*;
import ecom.entity.*;



@ManagedBean
public class Annonces implements Serializable{

	private static final long serialVersionUID = 1L;
	Log log = LogFactory.getLog(Annonces.class);
	private static final int BUFFER_SIZE = 6124;

	private AnnonceChercheurEntity annoncec = new AnnonceChercheurEntity();
	private AnnonceProprietaireEntity annoncep = new AnnonceProprietaireEntity();
	private List<AnnonceChercheurEntity> listeannoncesc;
	private List<AnnonceProprietaireEntity> listeannoncesp;
	private List<AnnonceChercheurEntity> listemesannoncesc;
	private List<AnnonceProprietaireEntity> listemesannoncesp;
	private String utilisateur;
	private long actionid;
	private int ville = 0;
	private int type = 2;
	private String photo = "./Photos/none.png";
	private String motcle = "";
	private boolean favori;
	
	@ManagedProperty(value = "#compteLogin")
	private CompteLogin compteLogin;

	// ************************ CONSTRUCTEUR *************************  




	public CompteLogin getCompteLogin() {
		return compteLogin;
	}



	public void setCompteLogin(CompteLogin compteLogin) {
		this.compteLogin = compteLogin;
	}



	public Annonces()
	{
		log.info("Annonces constructor started");
		//on cree le timer pour recuperer regulierement les devises
//		try {
//			javax.naming.Context ic = new javax.naming.InitialContext();
//			ITimerSessionBeanConverterStateless converter = (ITimerSessionBeanConverterStateless) ic.lookup("ecom.stateless.TimerSessionBeanConverterStateless@Remote");
//			converter.createTimer(10000);
//			
//		} catch (Exception e) {
//			e.printStackTrace();
//			throw new RuntimeException("Instance ConverterStateless introuvable", e);
//		}
		
		
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String, String> requestParams = fc.getExternalContext().getRequestParameterMap();
		String idc = (String) requestParams.get("acid");
		String idp = (String) requestParams.get("apid");
		String tp = (String) requestParams.get("tip");
		if (idc != null) {
			this.annoncec =  getInstanceChercheur().FindAnnonceChercheur(Long.parseLong(idc));
			this.photo = annoncec.getAnnonceentity().getPhoto();
		} else if(idp != null) {
			this.annoncep =  getInstanceProprietaire().FindAnnonceProprietaire(Long.parseLong(idp));            
			this.photo = annoncep.getAnnonceentity().getPhoto();
		} else if(tp != null) {
			if(Integer.parseInt(tp) == 1) {
				this.type = 1;
			} else if(Integer.parseInt(tp) == 2){
				this.type = 2;
			}
		} else {
			annoncec = new AnnonceChercheurEntity(null,"","","",0,null);
			annoncep = new AnnonceProprietaireEntity(null,"","","",0,0,0,null);
		}           
	}



	// ************************ INSTANCES *************************  

	private IAnnonceChercheurRemote getInstanceChercheur() {
		try {
			javax.naming.Context ic = new javax.naming.InitialContext();
			return (IAnnonceChercheurRemote) ic.lookup("ecom.stateless.AnnonceChercheurStateless@Remote");
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Instance chercheur introuvable", e);
		}
	}
	private IAnnonceProprietaireRemote getInstanceProprietaire() {
		try {
			javax.naming.Context ic = new javax.naming.InitialContext();
			return (IAnnonceProprietaireRemote) ic.lookup("ecom.stateless.AnnonceProprietaireStateless@Remote");
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Instance proprietaire introuvable", e);
		}
	}
	private IChercheurRemote getInstanceUtilisateurChercheur() {
		try {
			javax.naming.Context ic = new javax.naming.InitialContext();
			return (IChercheurRemote) ic.lookup("ecom.stateless.ChercheurStateless@Remote");
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Instance utilisateur chercheur introuvable", e);
		}
	}

	private IProprietaireRemote getInstanceUtilisateurProprietaire() {
		try {
			javax.naming.Context ic = new javax.naming.InitialContext();
			return (IProprietaireRemote) ic.lookup("ecom.stateless.ProprietaireStateless@Remote");
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Instance utilisateur proprietaire introuvable", e);
		}
	}

	// ************************ FIND ANNONCE *************************  

	public void findAnnoncesp() {
		try{
			this.listeannoncesp =  getInstanceProprietaire().FindAnnoncesProprietaire();
		}catch(Exception e){
		}
	}
	public void findAnnoncesp(int ville) {
		try{
			this.listeannoncesp =  getInstanceProprietaire().FindAnnoncesProprietaire(ville);
		}catch(Exception e){
		}
	}

	public void findAnnoncesc() {
		try{
			this.listeannoncesc =  getInstanceChercheur().FindAnnoncesChercheur();
		}catch(Exception e){
		}
	}
	public void findAnnoncesc(int ville) {
		try{
			this.listeannoncesc =  getInstanceChercheur().FindAnnoncesChercheur(ville);
		}catch(Exception e){
		}
	}

	public void findMesAnnoncesc() {
		ChercheurEntity MonChercheur = null;

		this.utilisateur = getUtilisateur();
		if("null".equals(this.utilisateur)) {
		} else {
			try{
				MonChercheur = getInstanceUtilisateurChercheur().findPseudo(this.utilisateur);                  
				this.listemesannoncesc = getInstanceChercheur().FindMesAnnoncesChercheur(MonChercheur);
			}catch(Exception e){
			}
		}
	}

	public void findMesAnnoncesp() {
		ProprietaireEntity MonChercheur = null;

		this.utilisateur = getUtilisateur();
		if("null".equals(this.utilisateur)) {
		} else {
			try{
				MonChercheur = getInstanceUtilisateurProprietaire().findPseudo(this.utilisateur);
				this.listemesannoncesp = getInstanceProprietaire().FindMesAnnoncesProprietaire(MonChercheur);
			}catch(Exception e){
			}
		}
	}




	// ************************ RECHERCHE ANNONCE *************************  

	public String rechercheParVille() throws NamingException {
		return "AnnoncesRecherche";
	}

	public String rechercheParMotsCles() throws NamingException {
		FacesMessage error = new FacesMessage("Erreur", "Recherche non implementee");
		FacesContext.getCurrentInstance().addMessage(null, error);
		return "AnnoncesRecherche";
	}


	// ************************ SAVE ANNONCE *************************  

	public String saveAnnoncec() throws NamingException {
		this.utilisateur = getUtilisateur();        	
		if("null".equals(this.utilisateur)) {
			return "LogError";
		} else {
			try{
				this.annoncec.setChercheurEntityAC(getInstanceUtilisateurChercheur().findPseudo(this.utilisateur));
				annoncec.setPhoto(photo);
				annoncec = getInstanceChercheur().CreateAnnonceChercheur(annoncec.getChercheurEntityAC(),annoncec.getTitre(),annoncec.getTexte(),annoncec.getVille(),annoncec.getDepartement(),annoncec.getPhoto());
				photo = "./Photos/none.png";

				Set<OptionPayante> setOptionsPayantes = new HashSet<OptionPayante>();
				for (OptionsPayantesPrises opt : listeOptionsPayantesPrises) {
					if (opt.isPrise()) // si l'option a ete selectionnee
						setOptionsPayantes.add(opt.getOption());
				}
				long idAnnonce = annoncec.getAnnonceid();
				String titreAnnonce = annoncec.getTitre();

				// si l'utilisateur a selectionne au moins une option
				if (!setOptionsPayantes.isEmpty()) {
					try {
						if (panierSessionBean != null)
							panierSessionBean.rajouterItems(idAnnonce, titreAnnonce, setOptionsPayantes);
						else
							log.error("referance panier session bean null");
					} catch (Exception e) {
						log.error("Instance PanierStateful introuvable");

					}
				}

			}catch(Exception e){
				log.error("\n           Echec de la creation de l'annonce chercheur");
				FacesMessage error = new FacesMessage("Erreur", "Echec de la publication de l'annonce");
				FacesContext.getCurrentInstance().addMessage(null, error);
				return "AnnoncesRecherche";         
			}

			log.info("\n           Annonce chercheur creee (id: "+annoncec.getId()+")");
			FacesMessage error = new FacesMessage("Succes", "Annonce publiee");
			FacesContext.getCurrentInstance().addMessage(null, error);
			annoncec = new AnnonceChercheurEntity(null,"","","",0, "./Photos/none.png");
			return "AnnoncesRecherche";         
		}
	}

	public String saveAnnoncep() throws NamingException {
		this.utilisateur = getUtilisateur();
		if("null".equals(this.utilisateur)) {
			return "LogError";
		} else {
			try{
				this.annoncep.setProprietaireEntityAP(getInstanceUtilisateurProprietaire().findPseudo(this.utilisateur));
				annoncep.setPhoto(photo);
				annoncep = getInstanceProprietaire().CreateAnnonceProprietaire(annoncep.getProprietaireEntityAP(),annoncep.getTitre(),annoncep.getTexte(),annoncep.getVille(),annoncep.getDepartement(),annoncep.getSurface(),annoncep.getLoyer(),annoncep.getPhoto());
				photo = "./Photos/none.png";

				Set<OptionPayante> setOptionsPayantes = new HashSet<OptionPayante>();
				for (OptionsPayantesPrises opt : listeOptionsPayantesPrises) {
					if (opt.isPrise()) // si l'option a ete selectionnee
						setOptionsPayantes.add(opt.getOption());
				}
				long idAnnonce = annoncep.getAnnonceid();
				String titreAnnonce = annoncep.getTitre();

				// si l'utilisateur a selectionne au moins une option
				if (!setOptionsPayantes.isEmpty()) {
					try {
						if (panierSessionBean != null)
							panierSessionBean.rajouterItems(idAnnonce, titreAnnonce, setOptionsPayantes);
						else
							log.error("referance panier session bean null");
					} catch (Exception e) {
						log.error("Instance PanierStateful introuvable");

					}
				}
			}catch(Exception e){
				log.error("\n           Echec de la creation de l'annonce proprietaire");
				FacesMessage error = new FacesMessage("Erreur", "Echec de la publication de l'annonce");
				FacesContext.getCurrentInstance().addMessage(null, error);
				return "AnnoncesRecherche";         
			}

			log.info("\n           Annonce proprietaire creee (id: "+annoncep.getId()+")");
			FacesMessage error = new FacesMessage("Succes", "Annonce publiee");
			FacesContext.getCurrentInstance().addMessage(null, error);
			annoncep = new AnnonceProprietaireEntity(null,"","","",0,0,0, "./Photos/none.png");
			return "AnnoncesRecherche";
		}
	}


	// ************************ CHANGE ANNONCE *************************  

	public String changeAnnoncec() throws NamingException {
		try{
			annoncec.setPhoto(photo);
			annoncec =  getInstanceChercheur().ModifAnnonceChercheur(annoncec.getId(),annoncec.getTitre(),
					annoncec.getTexte(),annoncec.getVille(),annoncec.getDepartement(),annoncec.getPhoto());
			photo = "./Photos/none.png";
		}catch(Exception e){
			log.error("\n           Echec de la modifiaction de l'annonce chercheur (id: "+annoncec.getId()+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec de la modification de l'annonce");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesChercheurModif?acid="+annoncec.getId();
		}
		log.info("\n           Annonce chercheur modifiee (id: "+annoncec.getId()+")");
		FacesMessage error = new FacesMessage("Succes", "Modifications sauvegardees");
		FacesContext.getCurrentInstance().addMessage(null, error);
		annoncec = new AnnonceChercheurEntity(null,"","","",0, "./Photos/none.png");
		return "AnnoncesChercheurPerso";
	}

	public String changeAnnoncep() throws NamingException {
		try{
			annoncep.setPhoto(photo);
			annoncep =  getInstanceProprietaire().ModifAnnonceProprietaire(annoncep.getId(),annoncep.getTitre(),
					annoncep.getTexte(),annoncep.getVille(),annoncep.getDepartement(),
					annoncep.getSurface(),annoncep.getLoyer(),annoncep.getPhoto());
			photo = "./Photos/none.png";
		}catch(Exception e){
			log.error("\n           Echec de la modifiaction de l'annonce proprietaire (id: "+annoncep.getId()+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec de la modification de l'annonce");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesProprietaireModif?apid="+annoncep.getId();
		}
		log.info("\n           Annonce proprietaire modifiee (id: "+annoncep.getId()+")");
		FacesMessage error = new FacesMessage("Succes", "Modifications sauvegardees");
		FacesContext.getCurrentInstance().addMessage(null, error);
		annoncep = new AnnonceProprietaireEntity(null,"","","",0,0,0, "./Photos/none.png");
		return "AnnoncesProprietairePerso";
	}


	// ****************************** GESTION DES FAVORIS *****************************  

	public String deleteFavoric() throws NamingException {
		try{
			utilisateur = getUtilisateur();
			compteLogin.compteproprietaireactif = getInstanceUtilisateurProprietaire().findPseudo(utilisateur);
			annoncec = getInstanceChercheur().FindAnnonceChercheur(actionid);
			List<AnnonceChercheurEntity> rem = compteLogin.compteproprietaireactif.getMesFavoris();
			List<AnnonceChercheurEntity> remcopy = new ArrayList<AnnonceChercheurEntity> (rem);
			for(AnnonceChercheurEntity item:remcopy)
				if (item.getId() == annoncec.getId()) rem.remove(item);
			compteLogin.compteproprietaireactif.setMesFavoris(rem);
			getInstanceUtilisateurProprietaire().SaveProprietaire(compteLogin.compteproprietaireactif);
		} catch(Exception e) {
			log.error("\n           Echec de la suppression du favori (id: "+actionid+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec de la suppression du favori");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesProprietaireFavorites";
		}
		log.info("\n           Annonce supprimee des favoris (id: "+annoncec.getId()+")");
		FacesMessage error = new FacesMessage("Succes", "Favori supprime");
		FacesContext.getCurrentInstance().addMessage(null, error);
		return "AnnoncesProprietaireFavorites";
	}

	public String deleteFavorip() throws NamingException {
		try{
			utilisateur = getUtilisateur();
			compteLogin.comptechercheuractif = getInstanceUtilisateurChercheur().findPseudo(utilisateur);
			annoncep = getInstanceProprietaire().FindAnnonceProprietaire(actionid);
			List<AnnonceProprietaireEntity> rem = compteLogin.comptechercheuractif.getMesFavoris();
			List<AnnonceProprietaireEntity> remcopy = new ArrayList<AnnonceProprietaireEntity> (rem);
			for(AnnonceProprietaireEntity item:remcopy)
				if (item.getId() == annoncep.getId()) rem.remove(item);
			compteLogin.comptechercheuractif.setMesFavoris(rem);
			getInstanceUtilisateurChercheur().SaveChercheur(compteLogin.comptechercheuractif);
		} catch(Exception e) {
			log.error("\n           Echec de la suppression du favori (id: "+actionid+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec de la suppression du favori");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesChercheurFavorites";
		}
		log.info("\n           Annonce supprimee des favoris (id: "+annoncep.getId()+")");
		FacesMessage error = new FacesMessage("Succes", "Favori supprime");
		FacesContext.getCurrentInstance().addMessage(null, error);
		return "AnnoncesChercheurFavorites";
	}

	public String deleteDirectFavoric() throws NamingException {
		try{
			utilisateur = getUtilisateur();
			compteLogin.compteproprietaireactif = getInstanceUtilisateurProprietaire().findPseudo(utilisateur);
			annoncec = getInstanceChercheur().FindAnnonceChercheur(actionid);
			List<AnnonceChercheurEntity> rem = compteLogin.compteproprietaireactif.getMesFavoris();
			List<AnnonceChercheurEntity> remcopy = new ArrayList<AnnonceChercheurEntity> (rem);
			for(AnnonceChercheurEntity item:remcopy)
				if (item.getId() == annoncec.getId()) rem.remove(item);
			compteLogin.compteproprietaireactif.setMesFavoris(rem);
			getInstanceUtilisateurProprietaire().SaveProprietaire(compteLogin.compteproprietaireactif);
		} catch(Exception e) {
			log.error("\n           Echec de la suppression du favori (id: "+actionid+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec de la suppression du favori");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesProprietaireFavorites";
		}
		log.info("\n           Annonce supprimee des favoris (id: "+annoncec.getId()+")");
		FacesMessage error = new FacesMessage("Succes", "Favori supprime");
		FacesContext.getCurrentInstance().addMessage(null, error);
		return "AnnoncesChercheurDetails?acid="+annoncec.getId();
	}

	public String deleteDirectFavorip() throws NamingException {
		try{
			utilisateur = getUtilisateur();
			compteLogin.comptechercheuractif = getInstanceUtilisateurChercheur().findPseudo(utilisateur);
			annoncep = getInstanceProprietaire().FindAnnonceProprietaire(actionid);
			List<AnnonceProprietaireEntity> rem = compteLogin.comptechercheuractif.getMesFavoris();
			List<AnnonceProprietaireEntity> remcopy = new ArrayList<AnnonceProprietaireEntity> (rem);
			for(AnnonceProprietaireEntity item:remcopy)
				if (item.getId() == annoncep.getId()) rem.remove(item);
			compteLogin.comptechercheuractif.setMesFavoris(rem);
			getInstanceUtilisateurChercheur().SaveChercheur(compteLogin.comptechercheuractif);
		} catch(Exception e) {
			log.error("\n           Echec de la suppression du favori (id: "+actionid+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec de la suppression du favori");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesChercheurFavorites";
		}
		log.info("\n           Annonce supprimee des favoris (id: "+annoncep.getId()+")");
		FacesMessage error = new FacesMessage("Succes", "Favori supprime");
		FacesContext.getCurrentInstance().addMessage(null, error);
		return "AnnoncesProprietaireDetails?apid="+annoncep.getId();
	}

	public String addFavoric() throws NamingException {
		try{
			utilisateur = getUtilisateur();
			compteLogin.compteproprietaireactif = getInstanceUtilisateurProprietaire().findPseudo(utilisateur);
			annoncec = getInstanceChercheur().FindAnnonceChercheur(annoncec.getId());
			compteLogin.compteproprietaireactif.getMesFavoris().add(annoncec);
			getInstanceUtilisateurProprietaire().SaveProprietaire(compteLogin.compteproprietaireactif);
		} catch(Exception e) {
			log.error("\n           Echec de l'ajout aux favoris (id: "+annoncec.getId()+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec de l'ajout du favori");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesChercheurDetails?acid=" + actionid;
		}
		log.info("\n           Annonce ajoutee aux favoris (id: "+annoncec.getId()+")");
		FacesMessage error = new FacesMessage("Succes", "Annonce ajoutee aux favoris");
		FacesContext.getCurrentInstance().addMessage(null, error);
		return "AnnoncesChercheurDetails?acid=" + actionid;
	}

	public String addFavorip() throws NamingException {
		try{
			utilisateur = getUtilisateur();
			compteLogin.comptechercheuractif = getInstanceUtilisateurChercheur().findPseudo(utilisateur);
			annoncep = getInstanceProprietaire().FindAnnonceProprietaire(annoncep.getId());
			compteLogin.comptechercheuractif.getMesFavoris().add(annoncep);
			getInstanceUtilisateurChercheur().SaveChercheur(compteLogin.comptechercheuractif);
		} catch(Exception e) {
			log.error("\n           Echec de l'ajout aux favoris (id: "+annoncep.getId()+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec de l'ajout du favori");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesProprietaireDetails?apid=" + actionid;
		}
		log.info("\n           Annonce ajoutee aux favoris (id: "+annoncep.getId()+")");
		FacesMessage error = new FacesMessage("Succes", "Annonce ajoutee aux favoris");
		FacesContext.getCurrentInstance().addMessage(null, error);
		return "AnnoncesProprietaireDetails?apid=" + actionid;
	}


	// ************************ ACTIVER / DESACTIVER ANNONCE *************************  

	public String activateAnnoncec() throws NamingException {
		try{
			annoncec = getInstanceChercheur().ActivateAnnonceChercheur(actionid);
		}catch(Exception e){
			log.error("\n           Echec de l'activation/desactivation de l'annonce chercheur (id: "+annoncec.getId()+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec du changement d'etat");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesChercheurPerso";
		}
		log.info("\n           Annonce chercheur activee/desactivee (id: "+annoncec.getId()+")");
		if(annoncec.getActive()) {
			FacesMessage error = new FacesMessage("Succes", "Annonce activee");
			FacesContext.getCurrentInstance().addMessage(null, error);
		} else {
			FacesMessage error = new FacesMessage("Succes", "Annonce desactivee");	
			FacesContext.getCurrentInstance().addMessage(null, error);
		}
		return "AnnoncesChercheurPerso";
	}

	public String activateAnnoncep() throws NamingException {
		try{
			annoncep = getInstanceProprietaire().ActivateAnnonceProprietaire(actionid);
		}catch(Exception e){
			log.error("\n           Echec de l'activation/desactivation de l'annonce proprietaire (id: "+annoncep.getId()+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec du changement d'etat");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesProprietairePerso";
		}
		log.info("\n           Annonce proprietaire activee/desactivee (id: "+annoncep.getId()+")");
		if(annoncep.getActive()) {
			FacesMessage error = new FacesMessage("Succes", "Annonce activee");
			FacesContext.getCurrentInstance().addMessage(null, error);
		} else {
			FacesMessage error = new FacesMessage("Succes", "Annonce desactivee");	
			FacesContext.getCurrentInstance().addMessage(null, error);
		}
		return "AnnoncesProprietairePerso";
	}



	// ************************ DELETE ANNONCE *************************  


	public String deleteAnnoncec() throws NamingException {
		try{
			getInstanceChercheur().DeleteAnnonceChercheur(actionid);
		}catch(Exception e){
			log.error("\n           Echec de la suppression de l'annonce chercheur (id: "+annoncec.getId()+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec de la suppression de l'annonce");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesChercheurPerso";
		}
		log.info("\n           Annonce chercheur supprimee (id: "+actionid+")");
		FacesMessage error = new FacesMessage("Succes", "Annonce supprimee");	
		FacesContext.getCurrentInstance().addMessage(null, error);
		return "AnnoncesChercheurPerso";
	}

	public String deleteAnnoncep() throws NamingException {
		try{
			getInstanceProprietaire().DeleteAnnonceProprietaire(actionid);
		}catch(Exception e){
			log.error("\n           Echec de la suppression de l'annonce proprietaire (id: "+annoncep.getId()+")");
			FacesMessage error = new FacesMessage("Erreur", "Echec de la suppression de l'annonce");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "AnnoncesProprietairePerso";
		}
		log.info("\n           Annonce proprietaire supprimee (id: "+actionid+")");
		FacesMessage error = new FacesMessage("Succes", "Annonce supprimee");	
		FacesContext.getCurrentInstance().addMessage(null, error);
		return "AnnoncesProprietairePerso";
	}



	// ************************ UPLOAD PHOTO *************************  


	public void uploadPhoto(FileUploadEvent event) {

		ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
		long rdm = System.currentTimeMillis();
		File result = new File(extContext.getRealPath("/Photos") + "/" + rdm + event.getFile().getFileName());
		try {
			FileOutputStream fileOutputStream = new FileOutputStream(result);
			byte[] buffer = new byte[BUFFER_SIZE];

			int bulk;
			InputStream inputStream = event.getFile().getInputstream();
			while (true) {
				bulk = inputStream.read(buffer);
				if (bulk < 0) {
					break;
				}
				fileOutputStream.write(buffer, 0, bulk);
				fileOutputStream.flush();
			}
			fileOutputStream.close();
			inputStream.close();
			photo = "./Photos/" + rdm + event.getFile().getFileName();
			log.info("\n           Photo enregistree");
			FacesMessage msg = new FacesMessage("Succes", "Upload de l'image termine!");
			FacesContext.getCurrentInstance().addMessage(null, msg);
		} catch (IOException e) {
			log.error("\n           Echec de l'upload de la photo");
			FacesMessage error = new FacesMessage("Erreur", "Echec de l'upload");
			FacesContext.getCurrentInstance().addMessage(null, error);
		}
	}



	// *********************************** GOTO *************************************  


	public String gotoModifc() throws NamingException {
		try{
			annoncec = getInstanceChercheur().FindAnnonceChercheur(actionid);
			photo = annoncec.getPhoto();
		}catch(Exception e){
			log.error("\n           Echec de la redirection");
		}
		log.info("\n           redirection Modif annonce (id: "+actionid+")");
		return "AnnoncesChercheurModif";
	}
	
	public String gotoModifp() throws NamingException {
		try{
			annoncep = getInstanceProprietaire().FindAnnonceProprietaire(actionid);
			photo = annoncep.getPhoto();
		}catch(Exception e){
			log.error("\n           Echec de la redirection");
		}
		log.info("\n           redirection Modif annonce (id: "+actionid+")");
		return "AnnoncesProprietaireModif";
	}
	
	
	public String gotoNouvellec() throws NamingException {
		try{
			photo = "./Photos/none.png";
			annoncec = new AnnonceChercheurEntity(null, "", "", "", 0, photo);
		}catch(Exception e){
			log.error("\n           Echec de la redirection");
		}
		log.info("\n           redirection Nouvelle annonce C");
		return "AnnoncesChercheurNouvelle";
	}
	
	public String gotoNouvellep() throws NamingException {
		try{
			photo = "./Photos/none.png";
			annoncep = new AnnonceProprietaireEntity(null, "", "", "", 0, 0, 0, photo);
		}catch(Exception e){
			log.error("\n           Echec de la redirection");
		}
		log.info("\n           redirection Nouvelle annonce P");
		return "AnnoncesProprietaireNouvelle";
	}
	
	
	
	
	
	
	

	// ************************ GETTERS/SETTERS VARIABLES LOCALES *************************  

	public long getActionid() {
		return this.actionid;
	}

	public void setActionid(long id) {
		this.actionid = id;
	}

	public List<AnnonceChercheurEntity> getListeannoncesc() {
		if((this.ville == 0)) {
			findAnnoncesc();
		} else {
			findAnnoncesc(this.ville);
		}
		this.listeannoncesp = null;
		return this.listeannoncesc;
	}

	public void setListeannoncesc(List<AnnonceChercheurEntity> liste) {
		this.listeannoncesc = liste;
	}

	public List<AnnonceProprietaireEntity> getListeannoncesp() {
		if(compteLogin.getSortedMethod() == 0)
		{		
			if(this.ville == 0) {
				findAnnoncesp();
			} else {
				findAnnoncesp(this.ville);
			} 
			this.listeannoncesc = null;
		
		}else
			if(compteLogin.getSortedMethod()==1)
					{
						sortByLoyerAnnonceProprietaire();
						log.info("sorted by loyer");
					}
			else
				if(compteLogin.getSortedMethod()==2)
				{
					sortByVilleAnnonceProprietaire();
					log.info("sorted by ville");
				}
				else
					if(compteLogin.getSortedMethod()==3)
					{
						sortByDateParutionAnnonceProprietaire();
						log.info("sorted by date parution");
					}else if(compteLogin.getSortedMethod()==4)
					{
						sortBySurfaceAnnonceProprietaire();
						log.info("sorted by Surface");
					}
		
		
					
		return this.listeannoncesp;
	}

	public void setListeannoncesp(List<AnnonceProprietaireEntity> liste) {
		this.listeannoncesp = liste;
	}



	public List<AnnonceChercheurEntity> getListemesannoncesc() {
		findMesAnnoncesc();
		return listemesannoncesc;
	}

	public void setListemesannoncesc(List<AnnonceChercheurEntity> listemesannoncesc) {
		this.listemesannoncesc = listemesannoncesc;
	}

	public List<AnnonceProprietaireEntity> getListemesannoncesp() {
		//              findMesAnnoncesp();
		return listemesannoncesp;
	}

	public void setListemesannoncesp(List<AnnonceProprietaireEntity> listemesannoncesp) {
		this.listemesannoncesp = listemesannoncesp;
	}



	public AnnonceChercheurEntity getAnnoncec() {
		return this.annoncec;
	}

	public void setAnnoncec() {
		this.annoncec = new AnnonceChercheurEntity(null,"","","",0, "./Photos/none.png");
	}

	public AnnonceProprietaireEntity getAnnoncep() {
		return this.annoncep;
	}

	public void setAnnoncep() {
		this.annoncep = new AnnonceProprietaireEntity(null,"","","",0,0,0, "./Photos/none.png");
	}

	public int getVille() {
		return ville;
	}

	public void setVille(int ville) {
		this.ville = ville;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	public String getUtilisateur() {

		if (compteLogin != null) {
			this.utilisateur = compteLogin.getPseudo();

		} else {
			this.utilisateur = new String("null");
			log.info("compteLogin null");
		}

		return utilisateur;

	}

	public void setUtilisateur(String utilisateur) {                
		this.utilisateur = utilisateur;
	}

	public String getPhoto() {
		return photo;
	}

	public void setPhoto(String photo) {
		this.photo = photo;
	}


	// Getters et Setters des fils

	public AnnonceEntity getAnnonceentity() {
		return this.annoncec.getAnnonceentity();
	}

	public void setAnnonceentity() {
		this.annoncec.setAnnonceentity(new AnnonceEntity("","",0,"", "./Photos/none.png"));
	}

	public int getLoyer() {
		return this.annoncep.getLoyer();
	}

	public void setLoyer(int loyer) {
		this.annoncep.setLoyer(loyer);
	}

	public int getSurface() {
		return this.annoncep.getSurface();
	}

	public void setSurface(int surface) {
		this.annoncep.setSurface(surface);
	}

	// ------------------------------------------------------
	// ************************ ALEX*************************
	// ------------------------------------------------------

	//private Log log = org.ow2.util.log.LogFactory.getLog(Annonces.class);

	private List<OptionsPayantesPrises> listeOptionsPayantesPrises = new ArrayList<OptionsPayantesPrises>();
	
	private List<Double> listValeurs = new ArrayList<Double>();
	private List<String> listDevice = new ArrayList<String>();
	
	public List<String> getListDevice() {
		return listDevice;
	}

	public void setListDevice(List<String> listDevice) {
		log.info("Annonces.setListDevice");
		javax.naming.Context ic;
		try {
			ic = new javax.naming.InitialContext();
			IConverterStateless converter = (IConverterStateless) ic.lookup("ecom.api.IConverterStateless@Remote");
			
			List<String> listDeviceS = converter.getNomsDevice();				
			this.listDevice.clear();
			for (String nom : listDeviceS) {
				this.listDevice.add(nom);
			}			
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}



	public List<Double> getListValeurs() {
		log.info("Annonces.getListValeurs");
		
		javax.naming.Context ic;
		try {
			ic = new javax.naming.InitialContext();
			IConverterStateless converter = (IConverterStateless) ic.lookup("ecom.stateless.ConverterStateless@Remote");
			
			List<Double> listValeursD = converter.getValeursDevice();	
			this.listValeurs.clear();
			
			for (double valeur : listValeursD) {
				log.info("Annonces added: "+valeur);
				this.listValeurs.add(valeur);
				
			}
			
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return this.listValeurs;
	}
	
	public void setListValeurs(List<Double> listValeurs) {
		this.listValeurs  = listValeurs;
		
		}

	@ManagedProperty(value = "#panierSessionBean")
	private Panier panierSessionBean;

	public Panier getPanierSessionBean() {
		return panierSessionBean;
	}



	public void setPanierSessionBean(Panier panierSessionBean) {
		this.panierSessionBean = panierSessionBean;
	}


	public List<OptionsPayantesPrises> getListeOptionsPayantesPrises() {
		log.info("getListeOptionsPayantesPrises()");
		try {
			javax.naming.Context ic = new javax.naming.InitialContext();
			IOptionPayanteStatelessRemote optPayante = (IOptionPayanteStatelessRemote) ic
					.lookup("ecom.OptionPayanteStateless@Remote");
			List<OptionPayante> listeOptionPayante = optPayante
					.getListeOptionPayante();
			listeOptionsPayantesPrises.clear();
			for (OptionPayante opt : listeOptionPayante) {
				OptionsPayantesPrises optPP = new OptionsPayantesPrises(opt,
						false);
				listeOptionsPayantesPrises.add(optPP);
			}

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Instance introuvable", e);
		}
		return listeOptionsPayantesPrises;
	}

	public void setListeOptionsPayantesPrises(
			List<OptionsPayantesPrises> listeOptionsPayantesPrises) {
		this.listeOptionsPayantesPrises = listeOptionsPayantesPrises;
	}
	
	public String sortByLoyerAnnonceProprietaire(){
		compteLogin.setSortedMethod(1);
		log.info("sort by loyer");
		List <AnnonceProprietaireEntity> listOptPayanteFirst = getInstanceProprietaire().sortByLoyerAnnonceProprietaireOptFirst();
		log.info("listOptPayanteFirst"+listOptPayanteFirst.size());
		for(AnnonceProprietaireEntity an :listOptPayanteFirst)
		{
			log.info("loyer annonce opt"+an.getLoyer());
		}
		listeannoncesp = new ArrayList<AnnonceProprietaireEntity>(listOptPayanteFirst);
		List <AnnonceProprietaireEntity> listSansOptPayante = getInstanceProprietaire().sortByLoyerAnnonceProprietaireSansOpt();
		log.info("listSansOptPayante" + listSansOptPayante.size());
		for(AnnonceProprietaireEntity an : listSansOptPayante)
		{
			log.info("loyer annonce sans opt="+an.getLoyer());
		}
		
		listeannoncesp.addAll(listSansOptPayante);
		log.info("end sortByLoyerAnnonceProprietaire()");
		return "AnnoncesRecherche";
		
	}
	public String sortByVilleAnnonceProprietaire(){
		compteLogin.setSortedMethod(2);
		log.info("sort by loyer");
		List <AnnonceProprietaireEntity> listOptPayanteFirst = getInstanceProprietaire().sortByVilleAnnonceProprietaireOptFirst();
		log.info("listOptPayanteFirst"+listOptPayanteFirst.size());
		for(AnnonceProprietaireEntity an :listOptPayanteFirst)
		{
			log.info("loyer annonce opt"+an.getLoyer());
		}
		listeannoncesp = new ArrayList<AnnonceProprietaireEntity>(listOptPayanteFirst);
		List <AnnonceProprietaireEntity> listSansOptPayante = getInstanceProprietaire().sortByVilleAnnonceProprietaireSansOpt();
		log.info("listSansOptPayante" + listSansOptPayante.size());
		for(AnnonceProprietaireEntity an : listSansOptPayante)
		{
			log.info("loyer annonce sans opt="+an.getLoyer());
		}
		
		listeannoncesp.addAll(listSansOptPayante);
		log.info("end sortByLoyerAnnonceProprietaire()");
		return "AnnoncesRecherche";
	}
	public String sortByDateParutionAnnonceProprietaire(){
		compteLogin.setSortedMethod(3);
		log.info("sort by DateParution");
		List <AnnonceProprietaireEntity> listOptPayanteFirst = getInstanceProprietaire().sortByDateParutionAnnonceProprietaireOptFirst();
		log.info("listOptPayanteFirst"+listOptPayanteFirst.size());
		for(AnnonceProprietaireEntity an :listOptPayanteFirst)
		{
			log.info("loyer annonce opt"+an.getLoyer());
		}
		listeannoncesp = new ArrayList<AnnonceProprietaireEntity>(listOptPayanteFirst);
		List <AnnonceProprietaireEntity> listSansOptPayante = getInstanceProprietaire().sortByDatePautionAnnonceProprietaireSansOpt();
		log.info("listSansOptPayante" + listSansOptPayante.size());
		for(AnnonceProprietaireEntity an : listSansOptPayante)
		{
			log.info("loyer annonce sans opt="+an.getLoyer());
		}
		
		listeannoncesp.addAll(listSansOptPayante);
		log.info("end sortByLoyerAnnonceProprietaire()");
		return "AnnoncesRecherche";
	}
	public String sortBySurfaceAnnonceProprietaire()
	{
		compteLogin.setSortedMethod(4);
		log.info("sort by DateParution");
		List <AnnonceProprietaireEntity> listOptPayanteFirst = getInstanceProprietaire().sortBySurfaceAnnonceProprietaireOptFirst();
		log.info("listOptPayanteFirst"+listOptPayanteFirst.size());
		for(AnnonceProprietaireEntity an :listOptPayanteFirst)
		{
			log.info("loyer annonce opt"+an.getLoyer());
		}
		listeannoncesp = new ArrayList<AnnonceProprietaireEntity>(listOptPayanteFirst);
		List <AnnonceProprietaireEntity> listSansOptPayante = getInstanceProprietaire().sortBySurfaceAnnonceProprietaireSansOpt();
		log.info("listSansOptPayante" + listSansOptPayante.size());
		for(AnnonceProprietaireEntity an : listSansOptPayante)
		{
			log.info("loyer annonce sans opt="+an.getLoyer());
		}
		
		listeannoncesp.addAll(listSansOptPayante);
		log.info("end sortByLoyerAnnonceProprietaire()");
		return "AnnoncesRecherche";
	}


	public boolean isFavori() {
		this.favori = false;
		if(compteLogin.isConnecte() && compteLogin.compteproprietaireactif != null)
		{
			List<AnnonceChercheurEntity> rem = compteLogin.compteproprietaireactif.getMesFavoris();
			for(AnnonceChercheurEntity item:rem)
				if (item.getId() == annoncec.getId()) this.favori = true;

		}
		if(compteLogin.isConnecte() && compteLogin.comptechercheuractif != null)
		{
			List<AnnonceProprietaireEntity> rem = compteLogin.comptechercheuractif.getMesFavoris();
			for(AnnonceProprietaireEntity item:rem)
				if (item.getId() == annoncep.getId()) this.favori = true;

		}
		return favori;
	}





	
	public void setFavori(boolean favori) {
		this.favori = favori;
	}



	public String getMotcle() {
		return motcle;
	}



	public void setMotcle(String motcle) {
		this.motcle = motcle;
	}


}
